5l0w qu3ry

概要

カテゴリをフィルタリングするシステムを構築したが初回取得時になぜか遅いので検証環境を構築した。
原因を特定して速くして欲しい。

前提条件

  • 初回取得時を再現するためにキャッシュをオフにしている、そのためキャッシュを使う様に設定を書き換える行為を禁止とする。
  • /var/www/html/index.php の変更禁止。

初期状態

curl localhost で取得しようとするがレスポンスが遅い。

終了状態

1300ms (1.3秒) 以内で取得出来るようにする。

解説

大量のデータからインデックスを貼らずに WHERE句を使うと非常に処理に時間がかかるという問題。

始めにアクセスしてみると処理時間にかなりの時間がかかっていることが確認できる。

curl localhost
件数:1999664処理時間:10.570826053619

/var/www/html/index.php を確認してみると以下 SQL を実行している。

SELECT COUNT(*) as num from ictsc where category = 5;

mariadb にアクセスし index が貼られているか確認する。

use db;
show index from ictsc;

Empty set (0.001 sec)

インデックスが貼られていないので作成する。

CREATE INDEX category_idx ON ictsc(category);

Query OK, 0 rows affected (31.338 sec)
Records: 0  Duplicates: 0  Warnings: 0

終了条件を満たすことが出来る。

curl localhost
件数:1999664処理時間:0.99307894706726